package com.thinkgsp.jxc.service;

import java.util.List;
import com.thinkgsp.jxc.model.Customer;
import com.thinkgsp.jxc.model.CustomerState;
import com.thinkgsp.jxc.persistence.CustomerMapper;
import com.thinkgsp.jxc.persistence.mybatis.PagingResult;
import com.thinkgsp.sys.persistence.PersistenceException;

/**
 * 客户对象的业务类
 * @author evan
 *
 */
public interface CustomerService {

	/**
	 * 设置客户持久化类，本方法用于测试目的
	 * @param custMapper
	 */
	public void setCustMapper(CustomerMapper custMapper);
	/**
	 * 根据客户Id获取客户
	 * @param custId 客户Id
	 * @return
	 */
	public Customer getCust(Integer custId);
	/**
	 * 根据上级客户获取客户列表,包含上级本身
	 * @param parentId 上级客户Id
	 * @return
	 */
	public List<Customer> getCustByParent(Integer parentId);
	/**
	 * 根据职员获取客户列表
	 * @param empId
	 * @return
	 */
	public List<Customer> getCustByEmp(Integer empId);
	
	/**
	 * 根据职员获取客户列表(分页)
	 * @param empId
	 * @param start
	 * @param size
	 * @return
	 */
	public PagingResult<Customer> getCustByEmp(Integer empId,int start,int size);
	/**
	 * 根据部门获取客户列表
	 * @param deptId
	 * @return
	 */
	public List<Customer> getCustByDept(Integer deptId);
	
	/**
	 * 根据部门获取客户列表(分页)
	 * @param deptId
	 * @param start
	 * @param size
	 * @return
	 */
	public PagingResult<Customer> getCustByDept(Integer deptId,int start,int size);
	/**
	 * 根据客户编码获取客户
	 * @param code 客户编码
	 * @return
	 */
	public Customer getCustByCode(String code);
	/**
	 * 获取所有客户资料
	 * @param custType 客户类型 : 1 客户 ; 2 供货商 ; 3 客户与供货商
	 * @return
	 */
	public List<Customer> getAllCust(Integer custType);
	
	/**
	 * 获取所有客户资料(分页)
	 * @param custType
	 * @param start
	 * @param size
	 * @return
	 */
	public PagingResult<Customer> getAllCust(Integer custType,int start,int size);
	
	/**
	 * 获取所有已删除的客户
	 * @return
	 */
	public List<Customer> getDeletedCustomers();
	
	/**
	 * 获取所有已删除的客户(分页)
	 * @param start
	 * @param size
	 * @return
	 */
	public PagingResult<Customer> getDeletedCustomers(int start,int size);
	/**
	 * 搜索客户
	 * @param custType 客户类型 : 1 客户 ; 2 供货商 ; 3 客户与供货商
	 * @param val 搜索关键字 搜索范围:编码，名称，监管网编码，名称拼音首字母
	 * @return
	 */
	public List<Customer> searchCust(Integer custType,String val);
	
	/**
	 * 搜索客户(分页)
	 * @param custType
	 * @param val
	 * @param start
	 * @param size
	 * @return
	 */
	public PagingResult<Customer> searchCust(Integer custType,String val,int start,int size);
	/**
	 * 保存客户 ,新增客户时信用额度与信用款期均为零
	 * @param cust
	 */
	public void saveCust(Customer cust) throws ModelExistsException,PersistenceException;
	/**
	 * 修改客户信用额度;必须有BOSS或管理员权限才能修改信用额度与信用款期
	 * @param custId
	 * @param amount
	 */
	public void updateCustCreditAmount(Integer custId,Integer amount);
	
	/**
	 * 修改客户信用天数;必须有BOSS或管理员权限才能修改信用额度与信用款期
	 * @param custId
	 * @param day
	 */
	public void updateCustCreditDay(Integer custId,Integer day);

	/**
	 * 锁定客户
	 * @param custId
	 */
	public void lockCust(Integer custId);
	
	/**
	 * 解锁客户
	 * @param custId
	 */
	public void unLockCust(Integer custId);
	
	/**
	 * 客户到期
	 * @param custId
	 */
	public void expireCust(Integer custId);
	
	/**
	 * 解除到期
	 * @param custId
	 */
	public void unExpireCust(Integer custId);
	
	/**
	 * 启用客户,本方法不用，使用deleteCust代替
	 * @param custId
	 */
	@Deprecated
	public void enableCust(Integer custId);
	
	/**
	 * 禁用客户,本方法不用，使用restoreCust代替
	 * @param custId
	 */
	@Deprecated
	public void disableCust(Integer custId);
	
	/**
	 * 删除客户,客户必须当期没有发生额，并且往来余额必须为零才能删除
	 * @param custId
	 */
	public void deleteCust(Integer custId) throws ServiceException;
	
	/**
	 * 恢复客户
	 * @param custId
	 */
	public void restoreCust(Integer custId);
	
	/**
	 * 计算客户当前的欠款金额
	 * @param custId
	 * @return
	 */
	public Integer calcCustCreditAmount(Integer custId);
	
	/**
	 * 计算客户当前的欠款天数
	 * @param day
	 * @return
	 */
	public Integer calcCustCreditDay(Integer custId);
	
	/**
	 * 检查客户有效性。
	 * 在客户开始交易之前进行检查,判断是否过期、锁定或删除
	 * @param custId 客户Id
	 * @param throwException true 当客户无效时抛出异常;false 在返回值时返回false
	 * @return 客户有效返回true
	 * @exception ServiceException 无效客户抛出异常
	 */
	public boolean checkStatus(Integer custId,boolean throwException) throws ServiceException;
	
	/**
	 * 检查客户的交易金额是否超出信用额度
	 * @param custId 客户Id
	 * @param amount 客户交易金额
	 * @return 未超出信用额度时返回true
	 * @exception ServiceException 当超出信用额度时抛出异常
	 */
	public boolean checkTradeCredit(Integer custId,Integer amount) throws ServiceException;
	
	/**
	 * 检查客户状态,如果enable=true，可以进行交易；否则不能交易
	 * @param custId
	 * @return
	 */
	public CustomerState checkCustomerState(Integer custId);
}
